#include <iostream>
#include <queue>

using namespace std;

typedef long long LL;

const int N = 1e4 + 10;

//思路：仅需将x=1的所有函数值计算出来，存入小根堆中，
//然后每次拿出堆顶元素，把对应的下一个函数值再计算出来

int n, m;
int a[N], b[N], c[N];

struct node
{
	LL f; // 函数值
	int num; // 函数编号
	int x; // 代入值

	bool operator<(const node& t) const
	{
		//小根堆，大元素下坠
		return f > t.f;
	}
};

priority_queue<node> heap;


//函数编号，代入值
LL calc(int i, int x)
{
	return a[i] * x * x + b[i] * x + c[i];
}

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i] >> b[i] >> c[i];
	}

	//1.把 x = 1 的值放入堆中
	for(int i = 1; i <= n; i++)
	{
		heap.push({calc(i, 1), i, 1});
	}

	//2.依次拿出 m 个值
	while(m--)
	{
		auto t = heap.top(); heap.pop();
		int f = t.f, num = t.num, x = t.x;

		cout << f << " ";
		//把下一个函数值放入堆中
		heap.push({calc(num, x + 1), num, x + 1});
	}

	return 0;
}

